package com.ourway.service;

import com.ourway.dtos.FeiShuDeptAddDTO;
import com.ourway.dtos.FeiShuUserAddDTO;
import com.ourway.dtos.FeiShuUserDeleteDTO;
import com.ourway.dtos.UserDTO;
import com.ourway.entity.FeiShuDepartment;
import com.ourway.entity.FeiShuUser;
import com.ourway.entity.FeiShuUserSync;
import com.ourway.entity.vo.*;
import org.json.JSONException;

import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * FeiShu服务类
 *
 * @author lwh
 * @date 2021/11/23
 */
public interface IFeiShuService {
    /**
     * 获取 tenant_access_token（企业自建应用）
     * @return tenant_access_token
     */
    String getTenantAccessToken();

    /**
     * 获取 user_access_token
     * @param tenantAccessToken tenant_access_token
     * @param code FeiShu登录用户身份
     * @return 登录预授权码
     */
    UserAccessTokenInfoVo getUserAccessToken(String tenantAccessToken, String code);

    /**
     * 获取 FeiShu登录重定向路由
     * @return FeiShu登录重定向路由
     * @throws UnsupportedEncodingException EnCode url 失败
     */
    String getLoginRedirectUrl() throws UnsupportedEncodingException;

    /**
     * 用户登录
     * @param userAccessTokenInfo 飞书用户信息
     * @return 登录成功后颁发token
     */
    String userLogin(UserAccessTokenInfoVo userAccessTokenInfo);

    /**
     * 发送消息
     * @param accessToken tenant_access_token
     * @param messageId 消息ID
     * @param answer 回复内容
     * @param eventId 事件ID
     * @throws JSONException json转换异常
     */
    void replyMsg(String accessToken, String messageId, String answer, String eventId) throws JSONException;

    /**
     * 订阅审批
     * @param accessToken tenant_access_token
     */
    void subScribeApproval(String accessToken);

    /**
     * 获取审批实例详情
     * @param accessToken tenant_access_token
     * @param instanceCode 审批实例 Code
     * @return 实例详情
     */
    FeiShuApprovalInfoResponseVo getApprovalInfo(String accessToken, String instanceCode);

    /**
     * 审批通过
     * @param accessToken tenant_access_token
     * @param approvalCode 审批定义 Code
     * @param instanceCode 审批实例 Code
     * @param openId 用户open_id
     * @param userId 操作用户
     * @param taskId 任务 ID
     */
    void approveInstance(String accessToken, String approvalCode, String instanceCode, String openId, String userId, String taskId, String comment, String eventId);

    /**
     * 审批通过
     * @param accessToken tenant_access_token
     * @param approvalCode 审批定义 Code
     * @param instanceCode 审批实例 Code
     * @param openId 用户open_id
     * @param userId 操作用户
     */
    boolean approveInstance(String accessToken, String approvalCode, String instanceCode, String openId, String userId, String taskId, String comment);

    /**
     * 发送审批消息卡片
     * @param accessToken tenant_access_token
     * @param replyUserId 申请人ID
     * @param approvalUserId 审批人ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param approvalName 审批名称
     * @param eventId 订阅事件ID
     * @param instanceCode 实例Code
     * @return true | false
     */
    boolean sendLeaveApprovalCard(String accessToken, String replyUserId, String approvalUserId, String startTime, String endTime, String approvalName, String instanceCode, String eventId);

    /**
     * 更新卡片
     * @param replyUserId 申请人ID
     * @param approvalName 审批名称
     * @param messageId 消息ID
     * @return true | false
     */
    boolean updateLeaveApprovalCard(String replyUserId, String approvalName, String messageId);

    /**
     * 获取所有部门
     */
    FeiShuSearchChildDeptVo getAllDepartment();

    /**
     * 获取部门下所有用户
     * @param deptId 部门ID
     */
    FeiShuSearchUserByDeptResponseVo getAllUserByDepartment(String deptId) throws JSONException;

    /**
     * 创建部门
     * @param param 部门参数
     * @return true | false
     */
    FeiShuDepartment createDept(FeiShuDeptAddDTO param) throws JSONException;

    /**
     * 获取用户列表
     * @param pageIndex 页数
     * @param pageSize 页大小
     * @return 分页列表-用户
     */
    PageResultDto<UserDTO> getUserList(int pageIndex, int pageSize);

    /**
     * 获取所有用户列表
     * @return 用户列表
     */
    List<UserDTO> getAllUser();

    /**
     * 查询员工号是否存在
     * @param userId 员工ID
     * @param userNo 员工号
     * @return true 存在 | false 不存在
     */
    Boolean checkUserNo(String userId, String userNo);

    /**
     * 查询飞书同步信息
     * @param userId 用户ID
     * @return 同步信息
     */
    FeiShuUserSync getUserSyncInfo(String userId);

    /**
     * 获取飞书用户
     * @param openId openId
     * @return 飞书用户信息
     */
    FeiShuUser getFeiShuUser(String openId);

    /**
     * 创建同步飞书用户
     * @param feiShuUserAddDTO 用户信息
     * @return true 成功 | false 失败
     */
    FeiShuUser createFeiShuUser(FeiShuUserAddDTO feiShuUserAddDTO);

    /**
     * 删除同步飞书用户
     * @param userDeleteDTO 用户信息
     * @return true 成功 | false 失败
     */
    Boolean deleteUser(FeiShuUserDeleteDTO userDeleteDTO);
}
